package vistas.ventanas;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Date;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

import com.toedter.calendar.JDateChooser;

import daos.AtletaDAO;
import entidades.Atleta;
import entidades.enums.Cinturon;
import entidades.enums.Dan;
import entidades.enums.TipoSangre;

public class EditarAtleta extends JDialog {

	private static final long serialVersionUID = 1L;
	private JTextField id, apellidos, nombres, direccion, telefonoA, telefonoB;
	private JDateChooser nacimiento, ingreso;
	private JComboBox<Dan> dan;
	private JComboBox<TipoSangre> tipoSangre;
	private JComboBox<Cinturon> cinturon;
	private JRadioButton becado, activo;
	private JButton editar, cancelar;
	private AtletaDAO atletaDAO;
	private Atleta atleta;
	private Integer FLAG;
	public static final int MODIFICAR = 3;
	public static final int ELIMINAR = 4;
	public static final int AGREGAR = 5;

	public EditarAtleta() {
		setTitle("Agregar nuevo atleta");
		instanciar_componentes();
		cargar_componentes();
		listeners();
		pack();
		setModal(true);
		setVisible(true);
	}

	public EditarAtleta(Integer identificador, int flag) {
		setTitle("Datos del atleta");
		instanciar_componentes();
		FLAG = flag;
		cargar_componentes();
		listeners();
		cargar_valores(identificador);
		pack();
		setModal(true);
		setVisible(true);
	}

	private void configurar_componente(JComponent tf, String s) {
		tf.setBorder(BorderFactory.createTitledBorder(s));
		tf.setPreferredSize(new Dimension(150, 40));
		if(tf.getClass() == JDateChooser.class){
			tf.setPreferredSize(new Dimension(150, 50));
		}	
	}

	private void instanciar_componentes() {
		FLAG = new Integer(AGREGAR);
		atletaDAO = new AtletaDAO();
		JPanel panel = new JPanel();
		setContentPane(panel);
		panel.setPreferredSize(new Dimension(800, 140));
		id = new JTextField();
		configurar_componente(id, "Cédula");
		apellidos = new JTextField();
		configurar_componente(apellidos, "Apellidos");
		nombres = new JTextField();
		configurar_componente(nombres, "Nombres");
		direccion = new JTextField();
		configurar_componente(direccion, "Dirección");
		telefonoA = new JTextField();
		configurar_componente(telefonoA, "Telefono A");
		telefonoB = new JTextField();
		configurar_componente(telefonoB, "Telefono B");
		dan = new JComboBox<Dan>();
		instanciarDan(dan);
		cinturon = new JComboBox<Cinturon>();
		instanciarCinturon(cinturon);
		editar = new JButton("Aceptar");
		cancelar = new JButton("Cancelar");
		nacimiento = new JDateChooser();
		nacimiento.setMaxSelectableDate(new Date());
		configurar_componente(nacimiento, "Fecha Nacimiento");
		ingreso = new JDateChooser(new Date());
		configurar_componente(ingreso, "Fecha Ingreso");
		tipoSangre = new JComboBox<TipoSangre>();
		configurar_componente(tipoSangre, "Grupo Sanguíneo");
		instanciarTipoSangre(tipoSangre);
		becado = new JRadioButton();
		becado.setText("Becado");
		configurar_componente(becado, "Becado");
		activo = new JRadioButton();
		activo.setText("Activo");
		activo.setSelected(true);
		configurar_componente(activo, "Activo");
		atleta = new Atleta();
	}

	private void instanciarTipoSangre(JComboBox<TipoSangre> tipoSangre2) {
		tipoSangre2.addItem(TipoSangre.Apos);
		tipoSangre2.addItem(TipoSangre.Aneg);
		tipoSangre2.addItem(TipoSangre.ABpos);
		tipoSangre2.addItem(TipoSangre.ABneg);
		tipoSangre2.addItem(TipoSangre.Bpos);
		tipoSangre2.addItem(TipoSangre.Bneg);
		tipoSangre2.addItem(TipoSangre.Opos);
		tipoSangre2.addItem(TipoSangre.Oneg);
	}

	private void instanciarCinturon(JComboBox<Cinturon> cb) {
		cb.setBorder(BorderFactory.createTitledBorder("Cinturon"));
		cb.setPreferredSize(new Dimension(150, 40));
		cb.addItem(Cinturon.blanco);
		cb.addItem(Cinturon.amarillo);
		cb.addItem(Cinturon.naranja);
		cb.addItem(Cinturon.azul);
		cb.addItem(Cinturon.verde);
		cb.addItem(Cinturon.marron);
		cb.addItem(Cinturon.negro);

	}

	private void instanciarDan(JComboBox<Dan> cb) {
		cb.setBorder(BorderFactory.createTitledBorder("Dan"));
		cb.setPreferredSize(new Dimension(150, 40));
		cb.addItem(Dan.primero);
		cb.addItem(Dan.segundo);
		cb.addItem(Dan.tercero);
		cb.addItem(Dan.cuarto);
		cb.addItem(Dan.quinto);
		cb.addItem(Dan.sexto);
		cb.addItem(Dan.septimo);
		cb.addItem(Dan.octavo);
		cb.addItem(Dan.noveno);
		cb.addItem(Dan.decimo);

	}

	private void cargar_componentes() {
		add(id);
		add(apellidos);
		add(nombres);
		add(direccion);
		add(telefonoA);
		add(telefonoB);
		add(cinturon);
		add(nacimiento);
		add(ingreso);
		add(tipoSangre);
		add(becado);
		add(activo);
		add(editar);
		add(cancelar);
	}

	public void cargar_valores(Integer identificador) {
		atleta = atletaDAO.actualizarDeudaAtleta(identificador);
		id.setText(String.valueOf(atleta.getId()));
		apellidos.setText(atleta.getApellidos());
		nombres.setText(atleta.getNombres());
		direccion.setText(atleta.getDireccion());
		telefonoA.setText(atleta.getTelefonoA());
		telefonoB.setText(atleta.getTelefonoB());
		cinturon.setSelectedItem(atleta.getCinturon());
		nacimiento.setDate(atleta.getFechaNacimiento());
		ingreso.setDate(atleta.getFechaInscripcion());
		tipoSangre.setSelectedItem(atleta.getTipoSangre());
		becado.setSelected(atleta.isBecado());
		activo.setSelected(atleta.isActivo());
		

		if (atleta.getDeuda() >= 1 && !atleta.isActivo()) {
			activo.setEnabled(false);
		}

		if (FLAG == MODIFICAR) {
			id.setEnabled(false);
			editar.setText("Modificar");
		}

		if (FLAG == ELIMINAR) {
			id.setEnabled(false);
			apellidos.setEnabled(false);
			nombres.setEnabled(false);
			direccion.setEnabled(false);
			telefonoA.setEnabled(false);
			telefonoB.setEnabled(false);
			dan.setEnabled(false);
			cinturon.setEnabled(false);
			ingreso.setEnabled(false);
			nacimiento.setEnabled(false);
			tipoSangre.setEnabled(false);
			becado.setEnabled(false);
			editar.setText("Eliminar");
			activo.setEnabled(false);
		}

	}

	private void listeners() {
		editar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					atleta.setId(Integer.parseInt(id.getText()));
					atleta.setApellidos(apellidos.getText());
					atleta.setNombres(nombres.getText());
					atleta.setCinturon((Cinturon) cinturon.getSelectedItem());
					atleta.setDireccion(direccion.getText());
					atleta.setTelefonoA(telefonoA.getText());
					atleta.setTelefonoB(telefonoB.getText());
					atleta.setTipoSangre((TipoSangre) tipoSangre
							.getSelectedItem());
					atleta.setFechaInscripcion(new java.sql.Date(ingreso
							.getDate().getTime()));
					atleta.setFechaNacimiento(new java.sql.Date(nacimiento
							.getDate().getTime()));
					atleta.setBecado(becado.isSelected());
					atleta.setActivo(activo.isSelected());
					if(nacimiento.getDate().after( ingreso.getDate())){
						JOptionPane
						.showMessageDialog(null,
								"La fecha de ingreso al sistema debe ser despues que la fecha de nacimiento");
						return;
					}
					if (FLAG == AGREGAR) {
						atleta.setActivo(true);
						atleta.setUltimoPago(new java.sql.Date(new Date()
								.getTime()));
						atleta.setDeuda(0);
						atletaDAO.guardaAtleta(atleta);
					}
					if (FLAG == MODIFICAR) {
						atletaDAO.actualizaAtleta(atleta);
					}
					if (FLAG == ELIMINAR)
						atletaDAO.eliminaAtleta(atleta);
					dispose();

				} catch (Exception e2) {
					if (FLAG == ELIMINAR){
						JOptionPane
						.showMessageDialog(null,
								"El atleta no puede ser eliminado probablemente\n porque participó en un evento. \n solo puede colocarlo como inactivo");
						return;
					}
					JOptionPane
							.showMessageDialog(null,
									"El usuario ya existe o faltan campos por llenar \n Verifique los datos");
				}

			}
		});

		cancelar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();

			}
		});

		id.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent e) {
				char vChar = e.getKeyChar();
				if (!(Character.isDigit(vChar)
						|| (vChar == KeyEvent.VK_BACK_SPACE) || (vChar == KeyEvent.VK_DELETE))) {
					e.consume();
				}
			}
		});

		telefonoA.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent e) {
				char vChar = e.getKeyChar();
				if (!(Character.isDigit(vChar)
						|| (vChar == KeyEvent.VK_BACK_SPACE) || (vChar == KeyEvent.VK_DELETE))) {
					e.consume();
				}
			}
		});

		telefonoB.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent e) {
				char vChar = e.getKeyChar();
				if (!(Character.isDigit(vChar)
						|| (vChar == KeyEvent.VK_BACK_SPACE) || (vChar == KeyEvent.VK_DELETE))) {
					e.consume();
				}
			}
		});
	}

}
